package org.my.spring.agent.common.domain;

import java.util.Objects;

/**
 * 通用响应结果封装类
 * 统一API接口返回格式，包含状态码、消息和数据
 * @param <T> 响应数据类型
 */
public record Result<T>(int code, String message, T data) {
    /**
     * 创建成功响应（无消息无数据）
     * @param <T> 数据类型
     * @return 成功响应对象，状态码200，默认消息"操作成功"
     */
    public static <T> Result<T> success() {
        return success("操作成功", null);
    }


    /**
     * 创建成功响应（带数据）
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 成功响应对象，状态码200，默认消息"操作成功"
     */
    public static <T> Result<T> success(T data) {
        return success("操作成功", data);
    }

    /**
     * 创建成功响应（带消息）
     * @param msg 成功消息
     * @param <T> 数据类型
     * @return 成功响应对象，状态码200
     */
    public static <T> Result<T> success(String msg) {
        return success(msg, null);
    }

    /**
     * 创建成功响应（带消息和数据）
     * @param msg 成功消息
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 成功响应对象，状态码200
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>(200, msg, data);
    }

    /**
     * 创建默认错误响应
     * @param <T> 数据类型
     * @return 错误响应对象，状态码500，默认消息"操作失败"
     */
    public static <T> Result<T> error() {
        return error(500, "操作失败");
    }

    /**
     * 创建自定义错误响应
     * @param code 错误状态码
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 错误响应对象
     */
    public static <T> Result<T> error(int code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 创建错误响应（带消息）
     * @param message 错误消息
     * @param <T> 数据类型
     * @return 错误响应对象，状态码500
     */
    public static <T> Result<T> error(String message) {
        return error(500, message);
    }

    /**
     * 判断响应是否成功
     * @param result 响应对象
     * @return true：成功响应（状态码200且对象非空），false：失败响应
     */
    public static boolean isSuccess(Result<?> result) {
        return Objects.nonNull(result) && 200 == result.code();
    }

    /**
     * 判断响应是否失败
     * @param result 响应对象
     * @return true：失败响应，false：成功响应
     */
    public static boolean isError(Result<?> result) {
        return !isSuccess(result);
    }

}

